package com.jinke.api.modules.third.ezeeship.model.request;

import com.jinke.api.modules.app.enums.OrderType;
import com.jinke.api.modules.ums.vo.UserChannelVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.math.BigDecimal;
import java.util.List;

@Data
public class EstimateRateRequest {
    @Data
    @Accessors(chain = true)
    public static class Address {
        @ApiModelProperty("姓名")
        private String personName;
        @ApiModelProperty("公司")
        private String company;
        @ApiModelProperty("电话")
        private String phone;
        @ApiModelProperty("邮箱")
        private String email;
        @ApiModelProperty("国家代码")
        private String countryCode;
        @ApiModelProperty("州代码，对于美国和加拿大的寄件，大多数承运商只接受两字符的州缩写")
        private String stateCode;
        @ApiModelProperty("地址所在州或省的名称或代码")
        private String state;
        @ApiModelProperty("城市")
        private String city;
        @ApiModelProperty("地址1")
        private String addressLine1;
        @ApiModelProperty("地址2")
        private String addressLine2;
        @ApiModelProperty("邮编")
        private String zipCode;
        @ApiModelProperty("是否验证")
        private Boolean isValid;
        @ApiModelProperty("是否住宅")
        private Boolean isResidential;
    }

    @Data
    public static class Parcel {
        @ApiModelProperty("此包的编号。默认值为1")
        private Integer packageNum;
        @ApiModelProperty("Parcel类型")
        private String packageCode;
        @ApiModelProperty("包裹数量(非平台属性)")
        private Integer packageAmount;
        @ApiModelProperty("包裹的长度。小数点分隔符最多可接受前六位和后四位。")
        @NotBlank(message = " can not be blank")
        private String length;
        @ApiModelProperty("地块的宽度。小数点分隔符最多可接受前六位和后四位。")
        @NotBlank(message = " can not be blank")
        private String width;
        @ApiModelProperty("包裹的高度。小数点分隔符最多可接受前六位和后四位。")
        @NotBlank(message = " can not be blank")
        private String height;
        @ApiModelProperty("用于长度、宽度和高度的单位。 cm/in ")
        private String distanceUnit;
        @ApiModelProperty("包裹的重量。小数点分隔符最多可接受前六位和后四位。")
        private String weight;
        @ApiModelProperty("包裹的重量。小数点分隔符最多可接受前六位和后四位。")
        private String weight2;
        @ApiModelProperty("重量的单位。lb/kg ")
        private String massUnit;
        @ApiModelProperty("附加信息")
        private Extra extra;

        // 保险
        @ApiModelProperty("是否参保")
        private Boolean isInsured;
        @ApiModelProperty("保险金额")
        private BigDecimal insurance;
    }

    @Data
    public static class Extra {
        @ApiModelProperty("保险金额")
        private BigDecimal insurance;
        @ApiModelProperty("是否需要货到付款服务（仅限UPS和FedEx）。 值为true、false")
        private Boolean isCod;
        @ApiModelProperty("待收金额")
        private BigDecimal codAmount;
        @ApiModelProperty("担保资金包括汇票、保付支票和其他（详情请参阅UPS和FedEx）。价值为“现金”、“任何”到“任何”）")
        private String paymentMethod;
        @ApiModelProperty("干冰的重量（不能超过整个包装的重量）。单位为KG（千克）")
        private Integer dryIceWeight;


    }

    @Data
    public static class LabelExtra {


        @ApiModelProperty("要打印在运输标签上的可选文本。最多 30 个字符。")
        private String reference;
        @ApiModelProperty("要打印在运输标签上的可选文本。最多 30 个字符。")
        private String reference2;

        @ApiModelProperty("关税和税款支付类型。值为 INT 类型 1（接收方）；2（发送方）。\n" +
                "如果目的地是亚马逊FBA仓库，关税应由SENDER支付。请申请更改默认设置并选择联邦快递国际服务")
        private int tariffPayType;
        @ApiModelProperty("最终收货人类型。值为 INT 类型 1（直接消费者）；2（政府实体）；3（其他/未知）；4（经销商）")
        private int consigneeType;

        @ApiModelProperty("1 仅限电池或电池组（ICAO/ IATA UN3480、PI965、第 II 部分）；\n" +
                "2 仅限电池或电池组（ICAO/IATA UN3090、PI968、第 II 部分）；\n" +
                "3 与设备包装在一起（ICAO/IATA UN3481、PI966、第 II 部分);\n" +
                "4 与设备一起包装(ICAO / IATA UN3091, PI969,第 II 部分);\n" +
                "5 包含在设备中(ICAO / IATA UN3481, PI967,第 II 部分);\n" +
                "6 包含在设备中(ICAO / IATA UN3091, PI970,第 II 部分) ）")
        private Integer batteryType;

        @ApiModelProperty("是否需要周六送货服务。取值为true,false")
        private Boolean isStd;
        @ApiModelProperty("要求标准或成人签名确认。\n" +
                "请参阅签名选项以了解所有值")
        private String signatureOption="4";

        @ApiModelProperty("正确/错误，FedEx One Rate 仅适用于 FedEx 2Day 服务。您可以选择以下包装类型：FedEx_Envelope、FedEx_Pak_1、fedex_Small_Box")
        private Boolean isFedexOneRate;
        @ApiModelProperty("EIN/SSN。需要报关或申请ITN。")
        private String einNumber;

        //新加字段2 海关申报表 start
        @ApiModelProperty("类型 lb/inch kg/cm")
        private String type;
        @ApiModelProperty("产地国家")
        private String countryOfOrigin;
        @ApiModelProperty("海关申报价值")
        private BigDecimal customsDeclaration;
        @ApiModelProperty("数量")
        private Integer quantity;
        @ApiModelProperty("数量单位")
        private String quantityUnit;
        @ApiModelProperty("商品重量")
        private BigDecimal weight;
        @ApiModelProperty("重量单位")
        private String weightUnit;
        @ApiModelProperty("商品描述")
        private String description;

        @ApiModelProperty("用途 MERCHANDISE GIFT eg.")
        private String contentsType;
        @ApiModelProperty("联系人")
        private String certifySigner;
        @ApiModelProperty("无法运输时处理方式")
        private String nonDeliveryOption;
        //新加字段2 end




//        //目前没用到的清关字段
//        @ApiModelProperty("正确/错误，FedEx One Rate 仅适用于 FedEx 2Day 服务。您可以选择以下包装类型：FedEx_Envelope、FedEx_Pak_1、fedex_Small_Box")
//        private Boolean isFedexOneRate;
//        @ApiModelProperty("EIN/SSN。需要报关或申请ITN。")
//        private String einNumber;
//        @ApiModelProperty("货运商")
//        private String carrierCode;
//        @ApiModelProperty("运输服务")
//        private String carrierServiceCode;
//        @ApiModelProperty("打印模版 标签的大小")
//        private Integer labelSize;
//        @ApiModelProperty("备注")
//        private String remark;
//        @ApiModelProperty("联系电话")
//        private String contactPhone;
//        @ApiModelProperty("产品模板")
//        private String productTemplate;
//        @ApiModelProperty("schedule B")
//        private String scheduleB;


    }

    @Data
    public static class CustomsDeclaration {
        private String contentsType;
        //货物的 EEL（Electronic Export Information，电子出口信息）/PFC（Prepaid Freight Collect，预付运费到付）类型。
        // 对于大多数从美国运往加拿大（CA）的货物，“30.36” 是适用的；对于大多数从美国运往其他地方的货物，“30.37 (a)” 是适用的。可能的值有 “30.37 (a)”“30.37 (h)”“30.37 (f)”“30.36”
        private String eelPfc;
        private List<Item> items;

        @Data
        public static class Item {
            private String quantityUnit;
            private int quantity;
            private BigDecimal weight;
            private String massUnit;
            private BigDecimal valueAmount;
            private String originCountry;
            private String tariffNumber;
            private String description;
        }

    }

    @ApiModelProperty("订单ID")
    private Integer orderId;

    @ApiModelProperty("发送方")

    private Address from;
    @ApiModelProperty("接收方")

    private Address to;
    @ApiModelProperty("清关单")
    private CustomsDeclaration customsDeclarations;


    @ApiModelProperty("货运商编码")
    private String carrierCode;
    @ApiModelProperty("运输服务编码")
    @NotBlank(message = "serviceCode can not be blank")
    private String serviceCode;
    @ApiModelProperty("运输服务ID")
    private Integer channelId;
    @ApiModelProperty("标签的大小。1代表6 4，2代表8.5 11。")
    private Integer labelSize;
    @ApiModelProperty("订单号，空则系统生成")
    private String orderNO;
    @ApiModelProperty("平台生成的订单号")
    private String platformNo;
    @ApiModelProperty("objectId")
    private String objectId;
    @ApiModelProperty("批次号")
    private String batchNO;
    @ApiModelProperty("发货日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private String shipDate;
    private Boolean isTest;
    @ApiModelProperty("包裹信息")
    @NotEmpty
    private List<@Valid Parcel> parcels;
    @ApiModelProperty("扩展信息")
    private LabelExtra extra;

    @ApiModelProperty("仅适用于 ITN。值是字符串类型 A（申请 ITN）；D（取消 ITN）；")
    private String actionCode;
    @ApiModelProperty("仅适用于取消 ITN")
    private String aesUid;

    private UserChannelVO userChannelVO;
    private OrderType orderType;


}
